package com.lanhai.mind.impl;
 
import com.lanhai.mind.beans.AgvBean;
import com.lanhai.mind.beans.AgvDataBean;
import com.lanhai.mind.dao.AgvDao;
import com.lanhai.mind.enums.AgvCurrentTransEnum;
import com.lanhai.mind.enums.AgvReceiveEnum;
import com.lanhai.mind.interfaces.IAgv;
import com.lanhai.mind.utils.Tools;

 
/**
 * 小车协议的实现类
 * 小车bean agvbean_{agvid}:bean
 * 点位与小车 agvdot{dotno}:{agvid}
 * @author zhengwei
 *
 */
public class AgvImpl implements IAgv{
	 
	

	/**
	 * 从redis中拿小车数据
	 */
	@Override
	public AgvBean getBean(int agvid) {
		// TODO
		String key=String.format("agvbean_%d", agvid);
		
		AgvBean tmp=null;
		if(tmp==null) {
			AgvDao dao=getDao(agvid);
			tmp=new AgvBean();
			tmp.setAgvId(agvid);
			tmp.setCurrentTrans(AgvCurrentTransEnum.None);
			tmp.setDownTrans(dao.isDownTrans());
			tmp.setUpTrans(dao.isUpTrans());
			tmp.setIp(dao.getIp());
			tmp.setPort(dao.getPort());
			
			//保存tmp
		}
		return tmp;
	}

	/**
	 * 从映射中拿（内存，暂时不考虑redis）
	 */
	@Override
	public AgvBean getBeanByDotNo(int dotNo) {
		// TODO 
		//String  key=String.format("agvdot_%d", dotNo);
		
		int agvid=0;
		 
		return getBean(agvid);
	}

	
	/**
	 *从数据库中拿小车数据(只从数据库中拿）
	 */
	@Override
	public AgvDao getDao(int agvid) {
		// TODO 
		return null;
	}

	/**
	 *缓存小车数据，同时更新小车点位
	 */
	@Override
	public void saveCache(int agvid, AgvBean bean) {
		// TODO 
		String key=String.format("agvbean_%d", agvid);
	}

	
	/**
	 *分析小车上报数据
	 */
	@Override
	public AgvDataBean analyseData(byte[] data) {
		if (data.length < 13) {
			return null;
		}
		// 只处理来自小车的数据
		if (data[0] != 0xA1) {
			return null;
		}
		AgvDataBean obj = new AgvDataBean();
		if (data[9] == 1) {
			// 小车异常
			obj.setType(AgvReceiveEnum.ERR);
			return obj;
		}

		obj.setType(AgvReceiveEnum.getAgvReceiveEnumByCode(data[2]));
		if (data[11] == 0x00) {
			// 全空
			obj.setUpFull(false);
			obj.setDownFull(false);
		} else if (data[11] == 0x01) {
			// 上空下满
			obj.setUpFull(false);
			obj.setDownFull(true);
		} else if (data[11] == 0x10) {
			// 上满下空
			obj.setUpFull(true);
			obj.setDownFull(false);
		} else if (data[11] == 0x11) {
			// 全满
			obj.setUpFull(true);
			obj.setDownFull(true);
		}
		obj.setPower(data[10]);
		obj.setRoad(data[3]);
		obj.setAgvId(data[1]);
		byte[] gpX = { data[5], data[6], 0, 0 };
		byte[] gpY = { data[7], data[8], 0, 0 };
		obj.setX(Tools.toIntL(gpX));
		obj.setY(Tools.toIntL(gpY));
		obj.setCmdStr(Tools.byte2HexStr(data));
		obj.setData(data);
		return obj;
	}

	/**
	 *释放小车占用资源 
	 */
	@Override
	public void releaseAgv(AgvBean agv) {
		// TODO Auto-generated method stub
		
		//充电
		//机台 
		//预判断点
		//点位和小车
		//小车装载情况
		//待命点
		//交管
	}

	
	
	/**
	 *
	 *更新小车当前的传输状态
	 */
	@Override
	public void updateCurrentTrans(int agvid, AgvCurrentTransEnum trans) {
		AgvBean ab=getBean(agvid);
		if(ab!=null) {
			ab.setCurrentTrans(trans); 
			saveCache(agvid, ab);
		}
		
	}
	 

}
